﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormContasAReceber : Form
    {
        private string operacao = "";

        public FormContasAReceber()
        {
            InitializeComponent();
        }

        private void FormContasAReceber_Load(object sender, EventArgs e)
        {
            //Popular a lista de recebimentos cadastrados
            this.dateTimePickerIni.Value = DateTime.Today;
            this.dateTimePickerFim.Value = DateTime.Today;

            List<FormaPagamentoVO> listFormaPagamentoVOs = ModelBO.getFormaPagamentos();
            listFormaPagamentoVOs.Add(FormaPagamentoVO.CreateFormaPagamentoVO(-1, ""));
            this.comboBoxFormaPagamento.DataSource = listFormaPagamentoVOs;

            List<ConvenioVO> listConvenioVOs = ModelBO.getConvenios(true);
            List<IdValueVO> listIdValueVOs = new List<IdValueVO>();
            listIdValueVOs.Add(IdValueVO.CreateIdValueVO("-1", ""));
            foreach (ConvenioVO convenioVO in listConvenioVOs)
                listIdValueVOs.Add(IdValueVO.CreateIdValueVO(convenioVO.idConvenio.ToString(), convenioVO.clienteVO.nome));
            comboBoxConvenio.DataSource = listIdValueVOs;
            comboBoxConvenio.SelectedValue = "-1";

            List<MensalistaVO> listMensalistaVOs = ModelBO.getMensalistas(true);
            List<IdValueVO> listIdValueVOs2 = new List<IdValueVO>();
            listIdValueVOs2.Add(IdValueVO.CreateIdValueVO("-1", ""));
            foreach (MensalistaVO mensalistaVO in listMensalistaVOs)
                listIdValueVOs2.Add(IdValueVO.CreateIdValueVO(mensalistaVO.idMensalista.ToString(), mensalistaVO.clienteVO.nome));
            comboBoxMensalista.DataSource = listIdValueVOs2;
            comboBoxMensalista.SelectedValue = "-1";

            buttonCancelar_Click(sender, e);

        }

        private void dataGridViewRecebimento_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            this.operacao = "excluir";

            List<RecebimentoVO> recebimentoList = (List<RecebimentoVO>)this.dataGridViewRecebimento.DataSource;
            RecebimentoVO recebimento = recebimentoList[this.dataGridViewRecebimento.CurrentRow.Index];
            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do recebimento " + recebimento.recebimento, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.delRecebimento(recebimento);

                this.dataGridViewRecebimento.DataSource = ModelBO.getRecebimentos();
                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.textBoxReferencia.Text.Trim().Length == 0)
                erros = erros + "Referência deve ser informada.\r\n";
            if (int.Parse(this.comboBoxConvenio.SelectedValue.ToString()) > 0 &&
                int.Parse(this.comboBoxMensalista.SelectedValue.ToString()) > 0)
                erros = erros + "Convênio e Mensalista não podem ser informados simultaneamente";
            if (this.checkBoxPago.Checked && (int)this.comboBoxFormaPagamento.SelectedValue == -1)
                erros = erros + "Forma de pagamento deve ser informado quando houver pagamento.\r\n";

            
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            RecebimentoVO recebimento = null;

            if (this.operacao.Equals("novo"))
            {
                recebimento = RecebimentoVO.CreateRecebimentoVO();
                recebimento.recebimento = this.textBoxReferencia.Text;
                recebimento.dtVencimento = this.dateTimePickerVcto.Value;
                recebimento.valor = this.numericUpDownValor.Value;
                recebimento.idConvenio = int.Parse(this.comboBoxConvenio.SelectedValue.ToString());
                recebimento.idMensalista = int.Parse(this.comboBoxMensalista.SelectedValue.ToString());
                recebimento.idMovimentacao = -1;
                if (this.checkBoxPago.Checked)
                {
                    recebimento.dtPagamento = this.dateTimePickerPgto.Value;
                    recebimento.valorRec = this.numericUpDownValorPgto.Value;
                    recebimento.formaPagamentoVO.idFormaPagamento = (int)this.comboBoxFormaPagamento.SelectedValue;
                }

                ModelBO.newRecebimento(recebimento);
            }
            if (this.operacao.Equals("editar"))
            {
                List<RecebimentoVO> recebimentoList = (List<RecebimentoVO>)this.dataGridViewRecebimento.DataSource;
                recebimento = recebimentoList[this.dataGridViewRecebimento.CurrentRow.Index];

                if (recebimento.idMovimentacao != -1 && recebimento.valorRec != this.numericUpDownValorPgto.Value)
                {
                    MovimentacaoVO mov = ModelBO.getMovimentacao(recebimento.idMovimentacao, false);
                    CabineVO cab = ModelBO.getCabine(mov.idCabineS);
                    MessageBox.Show("Você deve fazer uma provisão ou retirada para acerto do caixa da cabine: " + cab.cabine + " patio: " + cab.patioVO.patio + " no valor de " + (this.numericUpDownValorPgto.Value - recebimento.valorRec), "Atenção!");
                }

                recebimento.recebimento = this.textBoxReferencia.Text;
                recebimento.dtVencimento = this.dateTimePickerVcto.Value;
                recebimento.valor = this.numericUpDownValor.Value;
                recebimento.idConvenio = int.Parse(this.comboBoxConvenio.SelectedValue.ToString());
                recebimento.idMensalista = int.Parse(this.comboBoxMensalista.SelectedValue.ToString());
                recebimento.idMovimentacao = -1;
                if (this.checkBoxPago.Checked)
                {
                    recebimento.dtPagamento = this.dateTimePickerPgto.Value;
                    recebimento.valorRec = this.numericUpDownValorPgto.Value;
                    recebimento.formaPagamentoVO.idFormaPagamento = (int)this.comboBoxFormaPagamento.SelectedValue;
                }
                else
                {
                    recebimento.dtPagamento = null;
                    recebimento.valorRec = 0;
                    recebimento.formaPagamentoVO.idFormaPagamento = -1;
                }

                ModelBO.setRecebimento(recebimento);
            }
            this.operacao = "salvar";

            dataGridViewRecebimento.DataSource = ModelBO.getRecebimentos();
            setupButtonsControls();
        }


        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewRecebimento.Rows.Count > 0 && this.dataGridViewRecebimento.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.textBoxReferencia.Enabled = novo || edit;
            this.comboBoxConvenio.Enabled = novo || edit;
            this.comboBoxMensalista.Enabled = novo || edit;
            this.dateTimePickerVcto.Enabled = novo || edit;
            this.numericUpDownValor.Enabled = novo || edit;
            this.dateTimePickerPgto.Enabled = novo || edit;
            this.checkBoxPago.Enabled = novo || edit;
            this.numericUpDownValorPgto.Enabled = novo || edit;
            this.comboBoxFormaPagamento.Enabled = novo || edit;
            this.dataGridViewRecebimento.Enabled = !novo && !edit;

            if (!haRows || novo)
            {
                this.textBoxId.Text = "";
                this.textBoxReferencia.Text = "";
                this.comboBoxConvenio.SelectedValue = "-1";
                this.comboBoxMensalista.SelectedValue = "-1";
                this.dateTimePickerVcto.Value = DateTime.Now;
                this.numericUpDownValor.Value = 0;
                this.checkBoxPago.Checked = false;
                this.dateTimePickerPgto.Value = DateTime.Now;
                this.numericUpDownValorPgto.Value = 0;
                this.comboBoxFormaPagamento.SelectedValue = -1;
            }
            else
            {
                List<RecebimentoVO> recebimentoList = (List<RecebimentoVO>)this.dataGridViewRecebimento.DataSource;
                RecebimentoVO recebimento = recebimentoList[this.dataGridViewRecebimento.CurrentRow.Index];
                this.textBoxId.Text = recebimento.idRecebimento.ToString();
                this.textBoxReferencia.Text = recebimento.recebimento;
                this.comboBoxConvenio.SelectedValue = recebimento.idConvenio.ToString();
                this.comboBoxMensalista.SelectedValue = recebimento.idMensalista.ToString();
                this.dateTimePickerVcto.Value = recebimento.dtVencimento;
                this.numericUpDownValor.Value = recebimento.valor;
                this.checkBoxPago.Checked = recebimento.dtPagamento != null;
                if (recebimento.dtPagamento != null)
                {
                    this.dateTimePickerPgto.Value = (DateTime)recebimento.dtPagamento;
                    this.numericUpDownValorPgto.Value = recebimento.valorRec;
                    this.comboBoxFormaPagamento.SelectedValue = recebimento.formaPagamentoVO.idFormaPagamento;
                }
            }
            if (novo || edit){
                this.textBoxReferencia.Focus();
            }
        }

        private void checkBoxPago_CheckedChanged(object sender, EventArgs e)
        {
            this.labelPgto.Visible = this.checkBoxPago.Checked;
            this.labelVlrPago.Visible = this.checkBoxPago.Checked;
            this.labelFormaPagamento.Visible = this.checkBoxPago.Checked;
            this.dateTimePickerPgto.Visible = this.checkBoxPago.Checked;
            this.numericUpDownValorPgto.Visible = this.checkBoxPago.Checked;
            this.comboBoxFormaPagamento.Visible = this.checkBoxPago.Checked;
        }

        private void buttonPesquisar_Click(object sender, EventArgs e)
        {
            this.dataGridViewRecebimento.DataSource = ModelBO.getRecebimentos(null, null, null, null,
                 this.radioButtonEmAberto.Checked, this.radioButtonPagos.Checked,
                 this.dateTimePickerIni.Value, this.dateTimePickerFim.Value, null, null);
            setupButtonsControls();
        }

        private void dataGridViewRecebimento_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            DataGridView dgv = (DataGridView)sender;
            foreach (DataGridViewRow dgvr in dgv.Rows)
            {
                RecebimentoVO rvo = (RecebimentoVO)dgvr.DataBoundItem;
                MensalistaVO mensalistaVO = ModelBO.getMensalista(rvo.idMensalista);
                ConvenioVO convenioVO = ModelBO.getConvenio(rvo.idConvenio);

                if (mensalistaVO!=null) dgvr.Cells["mensalista"].Value = mensalistaVO.clienteVO.nome;
                if (convenioVO != null) dgvr.Cells["convenio"].Value = convenioVO.clienteVO.nome;
            }

        }

        private void comboBoxMensalista_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!((string)this.comboBoxMensalista.SelectedValue).Equals("-1"))
            {
                this.comboBoxConvenio.SelectedValue = "-1";
                this.labelWarningMensalista.Visible = true;
            }
            else
                this.labelWarningMensalista.Visible = false;
        }

        private void comboBoxConvenio_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBoxConvenio.SelectedValue!=null &&  !((string)this.comboBoxConvenio.SelectedValue).Equals("-1"))
                this.comboBoxMensalista.SelectedValue = "-1";

        }

        private void buttonRecibo_Click(object sender, EventArgs e)
        {
            NumeroPorExtenso npe = new NumeroPorExtenso(this.numericUpDownValorPgto.Value);
            string pagador = "";
            if (!this.comboBoxMensalista.SelectedValue.ToString().Equals("-1"))
                pagador = this.comboBoxMensalista.SelectedText;
            if (!this.comboBoxConvenio.SelectedValue.ToString().Equals("-1"))
                pagador = this.comboBoxConvenio.SelectedText;


            EmpresaVO empresaVO = ModelBO.getEmpresa(int.Parse(ModelBO.getParametro("Empresa Ativa")));
            List<EmpresaVO> listEmpresaVOs = new List<EmpresaVO>();
            listEmpresaVOs.Add(empresaVO);

            FormReportRecibo formx = new FormReportRecibo();
            formx.MdiParent = this.MdiParent;
            formx.setDataSource(listEmpresaVOs, pagador, empresaVO.nome, "", "", this.numericUpDownValorPgto.Value, npe.ToString(), empresaVO.cidade, this.textBoxReferencia.Text);
            formx.Show();

        }
    }
}
